package com.xiaoshuidi.cloud.module.iot.service;

import com.github.pagehelper.PageInfo;
import com.xiaoshuidi.cloud.module.iot.api.device.vo.DeviceListByNosApiReqVO;
import com.xiaoshuidi.cloud.module.iot.dal.pojo.DevicePrice;
import com.xiaoshuidi.cloud.module.iot.api.device.vo.PullDeviceApiVo;
import com.xiaoshuidi.cloud.module.iot.common.ResultModel;
import com.xiaoshuidi.cloud.module.iot.controller.admin.doorlock.vo.*;
import com.xiaoshuidi.cloud.module.iot.dal.model.account.CategorysByBrandVo;
import com.xiaoshuidi.cloud.module.iot.dal.pojo.DevicePrice;
import com.xiaoshuidi.cloud.module.iot.dal.pojo.TbAccountDo;
import com.xiaoshuidi.cloud.module.iot.dal.pojo.TbDeviceDo;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * @author Sky
 * create 2019/05/28
 * email sky.li@ixiaoshuidi.com
 **/
public interface LocalDeviceService {

    /**
     * 根据第三方login_name,login_key 拉取设备并存入IOT库
     *
     * @param tbAccountModels
     * @return
     */
    ResultModel saveDeviceListToIOTByLnLk(List<TbAccountDo> tbAccountModels) throws Exception;

    /**
     * 根据水滴api_no拉取设备并存入IOT库
     *
     * @param apiNos
     * @return
     */
    ResultModel saveDeviceListToIOTByApiNo(List<String> apiNos) throws Exception;

    /**
     * 根据品牌编号查询该品牌对接品类
     *
     * @param brandNo
     * @return
     */
    ResultModel<List<CategorysByBrandVo>> getCategoryByBrand(String brandNo);

    /**
     * 根据水滴api_no拉取设备列表并展示给第三方
     *
     * @param apiNos
     * @return
     */
    ResultModel<Map<String, List<PullDeviceVo>>> getDeviceListByApiNo(List<String> apiNos);

    /**
     * 根据device_name模糊查询设备列表（品类）
     *
     * @param tbDeviceDo
     * @return
     */
    ResultModel<List<PullDeviceVo>> getDevcieListByDeviceName(TbDeviceDo tbDeviceDo);

    /**
     * 根据device_no 列表批量查询设备列表
     *
     * @param deviceListByNosReqVO
     * @return
     */
    ResultModel<List<PullDeviceVo>> getDeviceListByDeviceNos(DeviceListByNosReqVO deviceListByNosReqVO);

    /**
     * 根据device_no 列表,批量清空设备剩余金额
     *
     * @param deviceNos
     * @return
     */
    ResultModel<DeviceChargeFeeClearResVO> setChargeFeeClear(List<DeviceChargeFeeClearReqVO> deviceNos);

    /**
     * 请求第三方获取第三方数据库中水电表读数
     *
     * @param deviceGetDailyPowerReqModel
     * @return
     */
    ResultModel<List<DeviceGetDailyPowerResModel>> getDailyPower(DeviceGetDailyPowerReqModel deviceGetDailyPowerReqModel) throws Exception;

    /**
     * 根据device_no 列表,批量入住退租
     *
     * @param deviceResideListReqVOS
     * @return
     */
    ResultModel<DeviceResideListResVO> setListResideStatus(List<DeviceResideListReqVO> deviceResideListReqVOS) throws Exception;

    /**
     * 根据device_no 列表批量分页查询设备列表
     *
     * @param deviceListByNosReqVO
     * @return
     */
    ResultModel<PageInfo<PullDeviceApiVo>> findDeviceListByDeviceNosPage(DeviceListByNosApiReqVO deviceListByNosReqVO);

    /**
     * 根据device_no 列表批量查询设备列表
     *
     * @param deviceListByNosReqVO
     * @return
     */
    ResultModel<List<PullDeviceVo>> findDeviceListByDeviceNos(DeviceListByNosReqVO deviceListByNosReqVO);

    /**
     * 根据device_no 查询总度数
     *
     * @param deviceNo
     * @return
     */
    DevicePrice getCurrentReading(String deviceNo);

    /**
     * 根据设备在线状态或电池电量批量查询设备列表
     * @param deviceListByNosReqVO
     * @return
     */
    ResultModel<List<PullDeviceApiVo>> findDeviceList(DeviceListByNosApiReqVO deviceListByNosReqVO);

    /**
     * 导入雷优设备信息
     * @param apiNo
     * @param file
     * @return
     */
    ResultModel saveLeiYouDeviceFromExcel(String apiNo, MultipartFile file);
}
